package agent

import (
	"context"
	"time"
)

// LLMInterface LLM服务接口
type LLMInterface interface {
	GenerateResponse(ctx context.Context, messages []LLMMessage) (string, error)
	GenerateStreamResponse(ctx context.Context, messages []LLMMessage, responseChan chan<- string) error
}

// LLMMessage LLM消息格式
type LLMMessage struct {
	Role    string `json:"role"`
	Content string `json:"content"`
}

// Message 消息结构
type Message struct {
	Role      string    `json:"role"`
	Content   string    `json:"content"`
	Timestamp time.Time `json:"timestamp"`
	SessionID string    `json:"session_id"`
}

// AgentResponse Agent响应
type AgentResponse struct {
	Content         string           `json:"content"`
	ExecutionResult *ExecutionResult `json:"execution_result,omitempty"`
	Timestamp       time.Time        `json:"timestamp"`
}

// Plan 执行计划
type Plan struct {
	ID          string      `json:"id"`
	Description string      `json:"description"`
	Steps       []PlanStep  `json:"steps"`
	CreatedAt   time.Time   `json:"created_at"`
}

// PlanStep 计划步骤
type PlanStep struct {
	ID          string                 `json:"id"`
	Type        string                 `json:"type"` // "tool_call", "llm_query", "memory_search"
	Description string                 `json:"description"`
	ToolName    string                 `json:"tool_name,omitempty"`
	Parameters  map[string]interface{} `json:"parameters,omitempty"`
	Order       int                    `json:"order"`
}

// ExecutionResult 执行结果
type ExecutionResult struct {
	PlanID      string       `json:"plan_id"`
	Success     bool         `json:"success"`
	ToolResults []ToolResult `json:"tool_results"`
	Error       string       `json:"error,omitempty"`
	Duration    time.Duration `json:"duration"`
}

// ToolResult 工具执行结果
type ToolResult struct {
	ToolName  string        `json:"tool_name"`
	Success   bool          `json:"success"`
	Output    string        `json:"output"`
	Error     string        `json:"error,omitempty"`
	Duration  time.Duration `json:"duration"`
	Timestamp time.Time     `json:"timestamp"`
}

// Tool 工具定义
type Tool struct {
	Name        string                 `json:"name"`
	Description string                 `json:"description"`
	Parameters  map[string]interface{} `json:"parameters"`
	Handler     ToolHandler            `json:"-"`
}

// ToolHandler 工具处理函数
type ToolHandler func(ctx context.Context, params map[string]interface{}) (string, error)

// Intent 用户意图
type Intent struct {
	Type       string                 `json:"type"`       // "time_query", "calculation", "chat", "memory_search"
	Confidence float64                `json:"confidence"` // 置信度 0-1
	Parameters map[string]interface{} `json:"parameters"`
	Entities   []Entity               `json:"entities"`
}

// Entity 实体信息
type Entity struct {
	Type  string `json:"type"`  // "location", "expression", "keyword"
	Value string `json:"value"`
	Start int    `json:"start"`
	End   int    `json:"end"`
}

// MemoryItem 记忆项
type MemoryItem struct {
	ID        string            `json:"id"`
	Content   string            `json:"content"`
	Type      string            `json:"type"` // "conversation", "fact", "preference"
	Metadata  map[string]string `json:"metadata"`
	Timestamp time.Time         `json:"timestamp"`
	SessionID string            `json:"session_id"`
	Score     float64           `json:"score"` // 重要性评分
}
